﻿



Imports System.Data
Imports System.ComponentModel
Imports System.Collections.ObjectModel
Imports System.Data.SqlClient
Imports System.Security.Permissions
Imports System.Text



Class FLDistEnPEJ 





Private EvenTriggerCod    As Boolean  = False 



Private negocioDistrib    As CSGeneralDistribLiq  

Private negocio           As CSGeneralEjecucion
Private servicioGralFL    As CSServiciosGenerales
Private servicioGralFrida As CServiciosGenerales 


'------Listas para la distribución: generación de PEJs----------------
Private lstSubPejEliminada      As List(Of Long) 
Private lstSubPEJEdicion        As List (Of SubPej)
private lstSubPEJ               As list( Of SubPej) 
Private lstPSEnProcesoEdicion   As ObservableCollection(Of CTPartidaSolicitud)
Private lstSimulacion           As list(Of CTCorridaIntermediario )



'-------Listas para el monitor-----------------------------------------
Private lstPSRecibidas          As ObservableCollection(Of CTPartidaSolicitud)
Private lstPSEnProceso          As ObservableCollection(Of CTPartidaSolicitud)
Private lstPSLiberadas          As ObservableCollection(Of CTPartidaSolicitud)


Private lstCANCELADASRecibidas  As ObservableCollection(Of CTPartidaAjuste)


'-------Lista de catálogo de Intermediarios
Private lstCatInterParamSel        As List(Of CTParamIntermediario)
Private lstCatInterParam           As List(Of CTParamIntermediario)



Private lstPAJCompuesta         As object
Private lstPAJCompUestaAplicada As Object 
Private lstPSCanceladaEJ        As Object 


Private psSelActual             As CTPartidaSolicitud 
Private dMontoTotalPeriodo      As Decimal

Private dTotalesDistribSimula   As CSGeneralEjecucion.structTotalesDistribPEJ  

Private dfechaPeriodEJ          As Date    'Fecha Inicial seleccionada para el periodo de la simulación
Private dFechaPeriodoEJFin      As Date    'Fecha Fin del periodo 
Private dFechaActual            As Date    'Fecha Actual

Private NOTIFICACIONES(3)     As String 


Private countMsg              As Long = 0 

Private const __TASA_MAX__    As Double = 10000


 






    Public Sub New()
       InitializeComponent()
       

       negocioDistrib     = new CSGeneralDistribLiq()  

       negocio            = New CSGeneralEjecucion()
       servicioGralFL     = New CSServiciosGenerales ()
       servicioGralFrida  = New CServiciosGenerales ()

       lstSubPEJEdicion   = New LIST(Of SubPej)
       lstSubPejEliminada = New List(Of Long )
       





       '--------------Inicio cargar Catálogo de intermediarios Seleccionados----------------  
          lstCatInterParam = servicioGralFL.ObtenerCatalogoInterParam()     
          lstCatInterParamSel = servicioGralFL.ObtenerCatalogoInterParamsel (nothing)

          colDitribInter.ItemsSource = lstCatInterParamSel
          grdParamIntermediario.ItemsSource = lstCatInterParam
       '--------------Fin cargar Catálogo de intermediarios----------------                        



       '--------------Inicio cargar mensajes de Notificaciones utilizados en la funcionalidad de Ejecución----------------      
        NOTIFICACIONES(0) = "CAMBIAR PS ENVIADA A EN PROCESO"
        NOTIFICACIONES(1) = "CAMBIAR PS EN PROCESO A LIBERADA"
        NOTIFICACIONES(2) = "APLICAR PAJs"
        NOTIFICACIONES(3) = "CANCELACION PS"
       '--------------Fin cargar mesnajes de Notificaciones utilizados en la funcionalidad de Ejecución----------------      
      
 

    
       '--------------Inicio Activación de Notificaciones----------------           
           CFLNotificacionDB.CreatePermission()                        
          dim modelo  = New CTModelMsgNotificacion(Me.Dispatcher,hilo)                     
          AddHandler modelo.PropertyChanged,AddressOf CountMsg_PropertyChanged                
       '--------------Fin Activación de Notificaciones----------------
    
           
        '--------------Inicio Estado Inicial de la pantalla de distribución---------------- 
          InicializarCtrlsDistrib()  
        '--------------Fin Estado Inicial de la pantalla de distribución----------------
      
                  
        
          
                        
       Mouse.OverrideCursor = Nothing
        

    End Sub

             
Private Sub CountMsg_PropertyChanged(sender As Object, e As PropertyChangedEventArgs)           
 
     If  hilo > 0 AND CType( sender,CTModelMsgNotificacion).numHilo = (hilo - 1) then      
        ActualizarPantallaPEJ()               
    End If  

End Sub




#Region "Botones"


Private Sub btnPasarAEnproc_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnPasarAEnproc.Click
 
   Dim lstPSEnviadasSeleccionadas as List(Of CTPartidaSolicitud)   
   Dim sMsgError                  As String = ""

   Dim eventoBit =  CBitacoraFRIDA.GenerarEvento (CBitacoraFRIDA.CveEventosBit.PASAR_PS_A_EN_PROCESO,CServiciosMacrosSyBaseDB.IDUSUARIO,"FLDistEnPEJ->btnPasarAEnproc_Click")    

         
   Mouse.OverrideCursor = Cursors.Wait 

   lstPSEnviadasSeleccionadas =  BSO.LstPs.FindAll(Function(x) x.SeleccionEJ  = True)   
   
   If Not lstPSEnviadasSeleccionadas is Nothing then 
       If lstPSEnviadasSeleccionadas.Count > 0 then          
         If  negocio.PasarPSEnviadaAEnProceso(lstPSEnviadasSeleccionadas,sMsgError,eventoBit ) = False then
                       
              If Not sMsgError.Equals("") then                  
                  MessageBox.Show("Sucedió un error al intentar pasar las PS de enviadas a en proceso. " & sMsgError)          
               End If 
         else      
             
             Try
             
              servicioGralFL.RegistrarNotificacion(NOTIFICACIONES(0))  
              ActualizarPantallaPEJ()              
              InicializarCtrlsDistrib()  'Estado Inicial de la pantalla de distribución              
              chkSelectTodoPS.IsChecked = False  

              Catch ex As Exception
                Dim errorBit =  eventoBit.GuardarError ("Error al actualizar la pantalla: " & ex.Message )
                MessageBox.Show ("Error al cargar la pantalla. Código de error: " & errorBit.IdError & "-" & errorBit.IdRegEvento,"Generación de PEJ", MessageBoxButton.OK,MessageBoxImage.Exclamation)                   
              End Try

         End If
         
       End If
 
   End If
   
   eventoBit.ActualizarFechaFinDelEvento ()
   Mouse.OverrideCursor = nothing
   
    
End Sub

Private Sub btnAplicarAjuste_Click(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles btnAplicarAjuste.Click
 

Dim chkPAJ     As CheckBox 
Dim sMsgError  As String  = ""
Dim lstErrores =  New  List(Of String)
Dim lstIdPS    =  New List(Of Long)



 Mouse.OverrideCursor = Cursors.Wait    

 
 Dim eventoBit =  CBitacoraFRIDA.GenerarEvento (CBitacoraFRIDA.CveEventosBit.APLICAR_AJUSTE ,CServiciosMacrosSyBaseDB.IDUSUARIO,"FLDistEnPEJ->btnAplicarAjuste_Click")    

   For Each Ajuste As Object In grdAJUMonitorEJ.Items

     chkPAJ =  grdAJUMonitorEJ.Columns(0).GetCellContent (Ajuste)     
       
     If chkPAJ.IsChecked = True then         
          eventoBit.GuadarDetalle ("ID_PS->ID_PEJ->ID_PAJ", Ajuste.PartidaSolicitudId.ToString () & "->" &Ajuste.PartidaEJId.ToString () & "->" & Ajuste.PartidaAjusteID)            
         If negocio.AplicarAjuste (Ajuste.PartidaSolicitudId,Ajuste.PartidaEJId,Ajuste.PartidaAjusteID,sMsgError) = False then 
            Dim errorBit = eventoBit.GuardarError (sMsgError) 
            lstErrores.Add (sMsgError)
            sMsgError = ""         
         else
            lstIdPS.Add(Ajuste.PartidaSolicitudId)    
         End If                       
      End If               
   Next


    If lstErrores.Count > 0 then 
       MessageBox.Show ("Ocurrieron errores en la aplcación de los ajustes, es probable que algunos de ellos no hayan sido aplicados. Visualizar el detalle y errores del evento: " & eventoBit.IdRegistro  ,"Aplicación de Ajustes", MessageBoxButton.OK,MessageBoxImage.Exclamation) 
    Else
     
       For Each IdPs As Long In lstIdPS 
           
           Dim id As Long = IdPs
           Dim ps As CTPartidaSolicitud = Nothing 
           ps = BSO.LstPS.Find (Function(x) x.PartidaSolId = Id) 

           If not ps is Nothing then 
               Try
               
                    Dim mensajeCierre = negocioDistrib.MensajeValidacionCierrePS(id)
                    If Not mensajeCierre.Length > 0 Then
                        BSO.CerrarPS(ps, "Cierre automático a través de la aplicacion de ajustes")
                        eventoBit.GuadarDetalle ("Cierre_automático_IdPS",ps.PartidaSolId)
                        eventoBit.GuadarDetalle ("Monto_actual",ps.CantidadActualPS)
                    End If

               Catch ex As Exception
                   Dim errorBit = eventoBit.GuardarError (ex.Message)
                   errorBit.GuardarDetalle ("IdPS_Con_Excepción_al_Cierre_Auto",ps.PartidaSolId)
               End Try

           End If

           
       Next


       MessageBox.Show ("La apliación de los ajustes ha sido correcta.", "Aplicación de Ajustes",MessageBoxButton.OK,MessageBoxImage.Information  ) 
       servicioGralFL.RegistrarNotificacion(NOTIFICACIONES(2))  
       ActualizarPantallaPEJ()              
       InicializarCtrlsDistrib()  'Estado Inicial de la pantalla de distribución              
       chkSelectTodoPAJ.IsChecked = False  
    End If

    eventoBit.ActualizarFechaFinDelEvento ()


   Mouse.OverrideCursor = Nothing 

End Sub


Private Sub btnAgregarPEJ_Click(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles btnAgregarPEJ.Click
   

  Dim subpejNuevo As SubPej = New SubPej()
  Dim inter       As CTParamIntermediario = Nothing 


  subpejNuevo.Intermediario = lstCatInterParamSel.Find(Function(x) x.IdIntermediario = 0) 
  subpejNuevo.Observaciones = ""
  subpejNuevo.Medio = ""
  subpejNuevo.HoraEjecucion = DateAndTime.Now 
  subpejNuevo.Flexible = False 
  subpejNuevo.Tasa = 0
  subpejNuevo.CantidadAsigInterm = 0
    
  subpejNuevo.PartidaEJId = CSGeneralEjecucion.__SINPARTIDAEJ__  'Este valor identifica las que se han generado en memoria y deberán ser insertadas
  AddHandler  subpejNuevo.PropertyChanged, AddressOf SubPej_PropertyChanged 

  lstSubPEJEdicion.Add (subpejNuevo) 



  grdDistribPEJ.ItemsSource =  lstSubPEJEdicion
  grdDistribPEJ.Items.Refresh 
  grdDistribPEJ.UpdateLayout ()


End Sub

Private Sub btnEliminarPEJ_Click(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles btnEliminarPEJ.Click
   
   Dim lstSubEjecParaEliminar As Object
   Dim simulacion As CTCorridaIntermediario  = Nothing 
   Dim IdInter    As Integer = 0

    If grdDistribPEJ.SelectedIndex <> CSGeneralEjecucion.__SINPARTIDAEJ__ then 

        lstSubEjecParaEliminar = grdDistribPEJ.SelectedItems 

        For Each subpejTmp As SubPej In lstSubEjecParaEliminar           
           lstSubPEJEdicion.Remove (subpejTmp)   
           If subpejTmp.PartidaEJId > CSGeneralEjecucion.__SINPARTIDAEJ__ then 
              lstSubPejEliminada.Add (subpejTmp.PartidaEJId )     
           End If           
        Next

        grdSimuladorEJ.Items.Refresh ()  
        grdDistribPEJ.Items.Refresh()
        grdDistribPEJ.UpdateLayout 

     End If


     cargarTextRemDistib()

       '-------------Inicio cargar Simulacion --------------------------
     Try
               


        Dim lstSimulacionMenos = negocio.ObtenerLstSimulacionBaseMenosEdicionIni (lstSimulacion,lstSubPEJ,lstCatInterParamSel, dMontoTotalPeriodo)  
        Dim lstSimulacionMas   = negocio.ObtenerLstSimulacionMasEdicion (lstSimulacionMenos,lstSubPEJEdicion,lstCatInterParamSel, dMontoTotalPeriodo )  

        grdSimuladorEJ.ItemsSource = lstSimulacionMas
        grdSimuladorEJ.UpdateLayout ()


       


       dTotalesDistribSimula         = negocio.ObtenerMontoTotalPsXInter(lstSimulacionMas)
       txtMontoTotInter.Text         = dTotalesDistribSimula.MontoOperado.ToString ("##,##0.00")
       txtMontoTotDisponible.Text    = dTotalesDistribSimula.MontoDisponible.ToString ("##,##0.00")
       txtPorcentajeOperado.Text     = dTotalesDistribSimula.PorcentajeOperado
       txtPorcentajeDisponible.Text  = dTotalesDistribSimula.PorcentajeDisponible



     Catch ex As Exception
            
     End Try    

   '-------------Fin cargar Simulacion --------------------------



End Sub

Private Sub btnGuardar_Click(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles btnGuardar.Click
    
  Dim lstFallas = New List(Of StringBuilder )
  Dim idPs  As Long 

  Dim eventoBit  As CSBitEvento = Nothing 


  
  idPs = psSelActual.PartidaSolId 
   
  
        
     Mouse.OverrideCursor = Cursors.Wait 

     '-------------------INICIO FUNCIONALIDAD DE GUARDAR EN BASE DE DATOS------------------

        If lstSubPEJEdicion.Count = 0 AND lstSubPejEliminada.Count = 0 THEN 'Validar que exista información para Guardar                               
             Mouse.OverrideCursor = Nothing              
             MessageBox.Show("Información guardada correctamente","Guardar información de la Distribución de PEJ",MessageBoxButton.OK, MessageBoxImage.Information  )             
             Exit SUB
        End If


          Try             

            'Validar que todos los intermediarios sean correctos antes de guardar (Agregar)
             For Each  pej As SubPej  in lstSubPEJEdicion
                If pej.Intermediario.IdIntermediario = 0 then                   
                   Mouse.OverrideCursor = Nothing 
                   MessageBox.Show("No se ha introducido un intermediario correcto","Guardar información de la Distribución de PEJ",MessageBoxButton.OK, MessageBoxImage.Exclamation  )
                   Exit SUB
                End If

                If pej.Tasa <= 0 then 
                   Mouse.OverrideCursor = Nothing 
                   MessageBox.Show("Favor de corregir la tasa para los intermediarios (Tasa > 0)","Guardar información de la Distribución de PEJ",MessageBoxButton.OK, MessageBoxImage.Exclamation  )
                   Exit SUB
                End If

                If pej.CantidadAsigInterm  <= 0 then 
                   Mouse.OverrideCursor = Nothing 
                   MessageBox.Show("Favor de corregir el monto asignado a los intermediarios (Monto > 0)","Guardar información de la Distribución de PEJ",MessageBoxButton.OK, MessageBoxImage.Exclamation  )
                   Exit SUB
                End If

             Next

             eventoBit = CBitacoraFRIDA.GenerarEvento (CBitacoraFRIDA.CveEventosBit.DISTRIB_TASA_INTERMEDIARIO,CServiciosMacrosSyBaseDB.IDUSUARIO,"FLDistEnPEJ->btnGuardar_Click")    
             eventoBit.GuadarDetalle ("idPS en proc",idPs)

             negocio.GuardarPEJ (lstSubPEJEdicion,lstSubPejEliminada,psSelActual,lstFallas,eventoBit)       
            
            If lstFallas.Count > 0 then 
                 Mouse.OverrideCursor = Nothing 
                 MessageBox.Show("Occurrió un error al intentar guardar la información; inténtelo de nuevo. Consulte el registro del Evento: " & eventoBit.IdRegistro ,"Guardar información de la Distribución de PEJ",MessageBoxButton.OK,MessageBoxImage.Error)        
                 Mouse.OverrideCursor = Cursors.Wait 
            Else
               Mouse.OverrideCursor = Nothing 
                MessageBox.Show("Información guardada correctamente","Guardar información de la Distribución de PEJ",MessageBoxButton.OK, MessageBoxImage.Information   )
               Mouse.OverrideCursor = Cursors.Wait 
            End If
            

            eventoBit.ActualizarFechaFinDelEvento ()

          Catch ex As Exception             
             Mouse.OverrideCursor = Nothing

             If Not eventoBit is Nothing then 
                Dim errorBit =   eventoBit.GuardarError (ex.Message)
                MessageBox.Show("Occurrió un error al intentar guardar la información; inténtelo de nuevo.  Consulte el código de error: " & errorBit.IdError & " - " &   eventoBit.IdRegistro   ,"Guardar información de la Distribución de PEJ",MessageBoxButton.OK,MessageBoxImage.Error)
             else
                MessageBox.Show("Occurrió un error al intentar guardar la información; inténtelo de nuevo. " & ex.Message     ,"Guardar información de la Distribución de PEJ",MessageBoxButton.OK,MessageBoxImage.Error)
             End If
                                        
             Mouse.OverrideCursor = Cursors.Wait 
          End Try
  

          If Not eventoBit is Nothing then 
              eventoBit.ActualizarFechaFinDelEvento 
          End If
            

 '-------------------FIN FUNCIONALIDAD DE GUARDAR EN BASE DE DATOS------------------



 '-------------------INICIO FUNCIONALIDAD DE REFRESH DESPUES DE GUARDAR LOS DATOS------------------

          Try
            BSO.CargarBSOActual()
         Catch ex As Exception
             Mouse.OverrideCursor = Cursors.Wait
             MessageBox.Show("Es probable que la BSO no haya sido cargada correctamente.", "Carga de la BSO", MessageBoxButton.OK,MessageBoxImage.Error)                              
             Mouse.OverrideCursor = Nothing 
          End Try       

        Mouse.OverrideCursor = Cursors.Wait 
        
        EvenTriggerCod = True 
        Dim listaAuxPSEnProc = negocio.ObtenerPSEnProcesoDeBSO ()
        lstPSEnProcesoEdicion= New ObservableCollection(Of CTPartidaSolicitud)(listaAuxPSEnProc)
        grdEnProcDistribEJ.ItemsSource = lstPSEnProcesoEdicion
        grdEnProcDistribEJ.UpdateLayout 
        EvenTriggerCod = false

        grdEnProcDistribEJ.SelectedItem   = listaAuxPSEnProc.Find (Function (x) x.PartidaSolId = idPs )



      


    '-------------------INICIO FUNCIONALIDAD DE REFRESH DESPUES DE GUARDAR LOS DATOS------------------


    

         Mouse.OverrideCursor = Nothing 


   

End Sub

Private Sub btnLiberarPEJ_Click(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles btnLiberarPEJ.Click
 Dim montoDeTolerancia As Double 
 Dim montoTotalPEJs    As Decimal 

 Dim montoDiferencia   As Decimal 
 

 Dim eventoBit =  CBitacoraFRIDA.GenerarEvento (CBitacoraFRIDA.CveEventosBit.LIBERAR_PS,CServiciosMacrosSyBaseDB.IDUSUARIO,"FLDistEnPEJ->btnLiberarPEJ_Click")    


   If lstSubPEJ is Nothing then 
      MessageBox.Show ("No existen Partidas de Ejecución a liberar","Liberación de partidas de ejecución",MessageBoxButton.OK,MessageBoxImage.Exclamation)
      Exit Sub 
   End If

   Mouse.OverrideCursor = Cursors.Wait   

   montoDeTolerancia = negocio.ObtenerMontoTolerancia 
   montoTotalPEJs = negocio.ObtenerTotalPSDistribEnPEJ (psSelActual) 

   montoDiferencia =  psSelActual.CantidadSol - montoTotalPEJs 
   If montoDiferencia < 0 then 
     montoDiferencia = montoDiferencia * -1
   End If

   
   If ( montoDiferencia <=   montoDeTolerancia)  then 

      if negocio.PasarPSEnProcesoALiberada (psSelActual,eventoBit) = False then 
         MessageBox.Show ("Ocurrió un error en la libración, favor de verificar el evento: " & eventoBit.IdRegistro, "Liberación de Partidas de Ejecución PEJ", MessageBoxButton.OK,MessageBoxImage.Information ) 
         eventoBit.ActualizarFechaFinDelEvento () 
      else
         eventoBit.ActualizarFechaFinDelEvento ()
         servicioGralFL.RegistrarNotificacion(NOTIFICACIONES(1))   
         ActualizarPantallaPEJ()             
         InicializarCtrlsDistrib()  'Estado Inicial de la pantalla de distribución       
         
          cargarTextRemDistib(true)
         
         MessageBox.Show ("Lberación Correcta", "Liberación de Partidas de Ejecución PEJ", MessageBoxButton.OK,MessageBoxImage.Information ) 
      End If
       
   Else 
     MessageBox.Show ("El monto total de distribución de PEJ debe ser menor que el monto PS + Tolerancia","Liberación de partidas de ejecución",MessageBoxButton.OK,MessageBoxImage.Exclamation)
   End If

   Mouse.OverrideCursor = Nothing 

End Sub

Private Sub btnGuardarParamInter_Click(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles btnGuardarParamInter.Click
Dim sMsgError As String = ""

Dim eventoBit =  CBitacoraFRIDA.GenerarEvento (CBitacoraFRIDA.CveEventosBit.PARAMETRIZAR_INTERMEDIARIOS,CServiciosMacrosSyBaseDB.IDUSUARIO,"FLDistEnPEJ->btnGuardarParamInter_Click")    

Mouse.OverrideCursor = Cursors.Wait  

  If negocio.ActualizarParamInter (lstCatInterParam, sMsgError,eventoBit) = True  then 
     Mouse.OverrideCursor = Nothing 
     
     eventoBit.ActualizarFechaFinDelEvento ()
     MessageBox.Show ("Los parámetros han sido actualizados correctamente.", "Actualización de parámetros de intermediarios", MessageBoxButton.OK, MessageBoxImage.Information)
     Mouse.OverrideCursor = Cursors.Wait

     lstCatInterParamSel = servicioGralFL.ObtenerCatalogoInterParamsel(Nothing)  
     colDitribInter.ItemsSource = lstCatInterParamSel
     ActualizarPantallaPEJ()              
     InicializarCtrlsDistrib()

  else
     Mouse.OverrideCursor = Nothing 
     Dim errorBit = eventoBit.GuardarError (sMsgError)
     eventoBit.ActualizarFechaFinDelEvento ()
     MessageBox.Show ("No se pudo actualizar los parámetros de los Intermediarios, verificar el código de error: " & errorBit.IdError & "-" & eventoBit.IdRegistro   , "Actualización de parámetros de intermediarios", MessageBoxButton.OK, MessageBoxImage.Exclamation)
  End If



  Mouse.OverrideCursor = Nothing 

End Sub

Private Sub btnCalcelapPS_Click(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles btnCalcelapPS.Click


  
  Dim sMsgError As String = ""


 '1) Validar que exista una observación 
   If txtObservacionCancelar.Text.Trim.Equals("") then 
      MessageBox.Show("No puede cancelar sin antes haber puesto una observacion sobre la causa de la cancelación","Cancelación PS", MessageBoxButton.OK,MessageBoxImage.Exclamation  ) 
      Exit sub
   End If


   '2) Confirmación 
   If MessageBox.Show ("Esta seguro de cancelar la PS actual?","Cancelación PS",MessageBoxButton.YesNo,MessageBoxImage.Question) = MessageBoxResult.No then 
    Exit Sub 
   End If


   Dim eventoBit =  CBitacoraFRIDA.GenerarEvento (CBitacoraFRIDA.CveEventosBit.CANCELAR_PS,CServiciosMacrosSyBaseDB.IDUSUARIO,"FLDistEnPEJ->btnCalcelapPS_Click")    

   Try
      If psSelActual is Nothing then
           MessageBox.Show("No puede cancelar, no existe una PS relacionada","Cancelación PS", MessageBoxButton.OK,MessageBoxImage.Exclamation  ) 
           eventoBit.GuadarDetalle("Estado_cancelación","No puede cancelar, no existe una PS relacionada")
           eventoBit.ActualizarFechaFinDelEvento ()
           Exit sub
      End If
      

      eventoBit.GuadarDetalle ("IdPS",psSelActual.PartidaSolId.ToString ())
      eventoBit.GuadarDetalle ("Comentario_cancelación",txtObservacionCancelar.Text)

      if negocio.CancelarPSDesdeEJecucion (psSelActual.PartidaSolId,txtObservacionCancelar.Text,sMsgError) = True then 

           servicioGralFL.RegistrarNotificacion(NOTIFICACIONES(3))   
           ActualizarPantallaPEJ()             
           InicializarCtrlsDistrib()  'Estado Inicial de la pantalla de distribución       
           cargarTextRemDistib(true)
                      

           MessageBox.Show ("Cancelación Correcta", "Cancelación de Partida de Solicitud", MessageBoxButton.OK,MessageBoxImage.Information ) 

      Else 

           Dim errorBit1 = eventoBit.GuardarError (sMsgError)
           MessageBox.Show ("No se pudo cancelar la PS, intentelo de nuevo  o verifique el código de error: " & errorBit1.IdError & "-" & eventoBit.IdRegistro , "Cancelación de Partida de Solicitud", MessageBoxButton.OK,MessageBoxImage.Exclamation  ) 

      End If
      
   Catch ex As Exception
      
      Dim errorBit2 = eventoBit.GuardarError (ex.Message)           
      MessageBox.Show("No se pudo cancelar la PS, verifique el código de error:" & errorBit2.IdError & "-" & eventoBit.IdRegistro ,"Cancelación de Partida de Solicitud", MessageBoxButton.OK, MessageBoxImage.Error) 
   End Try
  




    Try
        
        sMsgError = ""

       dMontoTotalPeriodo = negocio.ObtenerMontoTotalPS (dfechaPeriodEJ,sMsgError) 'Mandar posible mensaje de notificación
       
       If Not sMsgError.Equals ("") then 
          Dim errorBit3 = eventoBit.GuardarError (sMsgError) 
          errorBit3.GuardarDetalle ("ObtenerMontoTotalPS",dMontoTotalPeriodo)
          errorBit3.GuardarDetalle ("Simulación de valores", "Falla en la actualización de montos")
          errorBit3.GuardarDetalle ("Estatus Final", "La cancelación se realizó correctamente, pero fallo la actualización de la pantalla")

          MessageBox.Show("No se pudieron actualizar los montos. Salga de la pantalla y vuelva a entrar. Código de error: " & errorBit3.IdError,"Cancelación de Partida de Solicitud", MessageBoxButton.OK, MessageBoxImage.Error) 
       End If
       

       
       
       txtMontoTotal.Text = dMontoTotalPeriodo.ToString ("##,##0.00")                  
       lstSimulacion = negocio.ObtenerLstSimulacionBase (dfechaPeriodEJ.ToString ("yyyy-MM-dd"),lstCatInterParamSel, dMontoTotalPeriodo)
       grdSimuladorEJ.ItemsSource = lstSimulacion  
       grdSimuladorEJ.UpdateLayout ()
       
       dTotalesDistribSimula         = negocio.ObtenerMontoTotalPsXInter(lstSimulacion)
       
       txtMontoTotInter.Text         = dTotalesDistribSimula.MontoOperado.ToString ("##,##0.00")
       txtMontoTotDisponible.Text    = dTotalesDistribSimula.MontoDisponible.ToString ("##,##0.00")
       txtPorcentajeOperado.Text     = dTotalesDistribSimula.PorcentajeOperado
       txtPorcentajeDisponible.Text  = dTotalesDistribSimula.PorcentajeDisponible
                           
   Catch ex As Exception

         Dim errorBit4 = eventoBit.GuardarError (ex.Message)          
         errorBit4.GuardarDetalle ("Simulación de valores", "Falla en la actualización de montos")
         errorBit4.GuardarDetalle ("Estatus Final", "La cancelación se realizó correctamente, pero fallo la actualización de la pantalla")
         MessageBox.Show("No se pudieron actualizar los montos. Salga de la pantalla y vuelva a entrar. Código de error: " & errorBit4.IdError,"Cancelación de Partida de Solicitud", MessageBoxButton.OK, MessageBoxImage.Error) 
        lstSimulacion = Nothing 
   End Try


   eventoBit.ActualizarFechaFinDelEvento () 


End Sub


#End Region

#Region "GRIDS"




Private Sub grdEnProcDistribEJ_SelectionChanged(ByVal sender As System.Object , ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles grdEnProcDistribEJ.SelectionChanged
  Dim sMsgError           As String = ""
  Dim gridEnProc          As DataGrid = CType(sender,DataGrid )   
  Dim Intermediario       As CTParamIntermediario = Nothing
  Dim idInter             As Integer = -1
 

  '1) Para evitar duplicación de ejecución de eventos cuando se establezca el estado inicial de la pestaña de distribución
  If EvenTriggerCod = True  then 
        e.Handled = True 
        Exit Sub 
   End If



 '1) Se obtiene la PS seleccionada
  psSelActual= CType (gridEnProc.SelectedItem ,CTPartidaSolicitud) 'Ps Seleccionado

 

 '1.1) Cargar combo de intermediarios, según, el TVNG seleccionado
  lstCatInterParamSel = servicioGralFL.ObtenerCatalogoInterParamsel(psSelActual)  
  colDitribInter.ItemsSource = lstCatInterParamSel




 
 '2) Se limpian las listas globales de edición y eliminadas, y se establece la lista de subpej según la PS seleccionada  
   chkActivarEdicionPEJ.IsEnabled = True 
   lstSubPejEliminada.Clear()
   lstSubPEJEdicion.Clear()
   lstSubPEJ = negocio.ObtenerListaSubPEJEdicionXPS(psSelActual,lstCatInterParamSel )

   chkCancelarPS.IsEnabled = True 
   chkCancelarPS.IsChecked = False



  '3) Se genera el clon para la lista de edición  
   If Not lstSubPEJ is Nothing then    
        For Each spej As SubPej In lstSubPEJ
           Dim subpejAux  = CType(spej.Clone,SubPej )             
            AddHandler  subpejAux.PropertyChanged, AddressOf SubPej_PropertyChanged 
           lstSubPEJEdicion.Add (subpejAux)           
        Next
       
   End If



    '4) Para cada vez que se seleccione un PS y el Check este habilitado, se debe de actualizar la información de la simulación.
    If chkActivarEdicionPEJ.IsChecked = True then 

           '-------------Inicio cargar Simulacion --------------------------

            Try
               
                
                dMontoTotalPeriodo = negocio.ObtenerMontoTotalPS (dfechaPeriodEJ,sMsgError) 'Mandar posible mensaje de notificación
                txtMontoTotal.Text = dMontoTotalPeriodo.ToString ("##,##0.00")  

               lstSimulacion = negocio.ObtenerLstSimulacionBase (dfechaPeriodEJ.ToString ("yyyy-MM-dd"),lstCatInterParam,dMontoTotalPeriodo)
               Dim lstSimulacionMenos = negocio.ObtenerLstSimulacionBaseMenosEdicionIni (lstSimulacion,lstSubPEJ,lstCatInterParam,dMontoTotalPeriodo )    'Se obtiene la lista con información Base menos la lista que esta en edición
               Dim lstSimulacionMas   = negocio.ObtenerLstSimulacionMasEdicion (lstSimulacionMenos,lstSubPEJEdicion,lstCatInterParam,dMontoTotalPeriodo ) 'A la lista  lstSimulacionMenos se le agraga la actual lista en edición

               grdSimuladorEJ.ItemsSource = lstSimulacionMas
               grdSimuladorEJ.UpdateLayout ()
                


                dTotalesDistribSimula         = negocio.ObtenerMontoTotalPsXInter(lstSimulacion)
                txtMontoTotInter.Text         = dTotalesDistribSimula.MontoOperado.ToString ("##,##0.00")
                txtMontoTotDisponible.Text    = dTotalesDistribSimula.MontoDisponible.ToString ("##,##0.00")
                txtPorcentajeOperado.Text     = dTotalesDistribSimula.PorcentajeOperado
                txtPorcentajeDisponible.Text  = dTotalesDistribSimula.PorcentajeDisponible


            Catch ex As Exception
                 MessageBox.Show ("ERRSIMEJ003 La información de la simulación no se encuentra disponible debido a: " & ex.Message, "Obtención de datos de simulación", MessageBoxButton.OK,MessageBoxImage.Warning)
                 lstSimulacion = Nothing 
            End Try    



            '-------------Fin cargar Simulacion --------------------------
            

           colDitribInterEdicion.ItemsSource = lstCatInterParamSel
           grdDistribPEJ.ItemsSource  = lstSubPEJEdicion
           grdDistribPEJ.Items.Refresh 
        else        

           grdDistribPEJ.ItemsSource  = Nothing
        End If


     
   grdDistribAlmacenadaPEJ.ItemsSource = lstSubPEJ      
   grdDistribAlmacenadaPEJ.UpdateLayout 
   if Not lstSubPEJ is Nothing then 
      btnLiberarPEJ.IsEnabled = True  
   End If



   
   grdDistribPEJ.Items.Refresh 
   grdDistribPEJ.UpdateLayout 

    
End Sub

Private Sub grdEnProcMonitorEJ_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles grdEnProcMonitorEJ.MouseDoubleClick
    Dim miGrid As DataGrid = sender
    Dim objDepend As DependencyObject = e.OriginalSource


    While Not objDepend Is Nothing

          If objDepend.GetType().Name = "DataGridCell" Then
              Dim row As Integer = miGrid.Items.IndexOf(CType(miGrid.CurrentCell.Item, CTPartidaSolicitud))

              If miGrid.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected Then
                  miGrid.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.Collapsed
              Else
                  miGrid.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected
              End If
           End If

      objDepend = VisualTreeHelper.GetParent(objDepend)

    End While
End Sub

Private Sub grdLiberadaMonitorEJ_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles grdLiberadaMonitorEJ.MouseDoubleClick

Dim miGrid As DataGrid = sender
    Dim objDepend As DependencyObject = e.OriginalSource


    While Not objDepend Is Nothing

          If objDepend.GetType().Name = "DataGridCell" Then
              Dim row As Integer = miGrid.Items.IndexOf(CType(miGrid.CurrentCell.Item, CTPartidaSolicitud))

              If miGrid.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected Then
                  miGrid.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.Collapsed
              Else
                  miGrid.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected
              End If
           End If

      objDepend = VisualTreeHelper.GetParent(objDepend)

    End While


End Sub

Private Sub grdParamIntermediario_CellEditEnding(ByVal sender As System.Object , ByVal e As System.Windows.Controls.DataGridCellEditEndingEventArgs) Handles grdParamIntermediario.CellEditEnding
        InhabilitarCheckParamInter()        
End Sub






#Region "EDICION GRID (CAPTURA)"

    
        Private Sub grdDistribPEJ_CellEditEnding(ByVal sender As System.Object , ByVal e As System.Windows.Controls.DataGridCellEditEndingEventArgs) Handles grdDistribPEJ.CellEditEnding
        
           Dim colIndexNumericos() As Boolean  = {False,True,True,false,False,false}   'Mascara de validación de numéros
           Dim colLongitudText() As Integer = {-1,-1,-1,30,-1,150} 'Máscara de longitudes permitidos para texto 
           Dim txtContenidoCelda As Object 
          
             Try
           
                 If e.EditAction <> DataGridEditAction.Cancel   then 
          
                     If not sender.CurrentItem is Nothing then
           
                         If colIndexNumericos(e.Column.DisplayIndex) = true then 
                          
                               txtContenidoCelda    = sender.Columns(e.Column.DisplayIndex).GetCellContent(ctype( e.Row.Item,SubPej))                              
                               If Not IsNumeric (txtContenidoCelda.Text) then                                  
                                  CType(sender,DataGrid).CancelEdit (DataGridEditingUnit.Cell)                                                              
                               else          
                                  Dim valorIntroducido As Decimal = Convert.ToDecimal (txtContenidoCelda.Text)
                                                                                                                                              
                                  If  valorIntroducido     < 0  then 
                                        CType(sender,DataGrid).CancelEdit (DataGridEditingUnit.Cell)                                                                                                                                                                                                                                                                                                                              
                                  End If      
                                  
                                  'VALIDACION DE LA TASA
                                  If e.Column.DisplayIndex = 2 then 
                                     If valorIntroducido  > __TASA_MAX__ then 
                                        CType(sender,DataGrid).CancelEdit (DataGridEditingUnit.Cell)
                                     End If
                                  End If
                                                          
        
                               End If        
                               
                         Else 'Trucado de los valores texto introducidos
                          
                              If colLongitudText(e.Column.DisplayIndex) > 0 then 
                                 txtContenidoCelda    = sender.Columns(e.Column.DisplayIndex).GetCellContent(ctype( e.Row.Item,SubPej))                              
                                 If txtContenidoCelda.text.ToString.Length > colLongitudText(e.Column.DisplayIndex) then 
                                     txtContenidoCelda.text = txtContenidoCelda.text.ToString.Substring(0,colLongitudText(e.Column.DisplayIndex)-1)
                                 End If
                              End If
                                                                                                                                                                                         
                         End If                                       
                     else
                         CType(sender,DataGrid).CancelEdit (DataGridEditingUnit.Cell)  
                     End If
          
        
                    End If
        
          
           Catch ex As Exception
              CType(sender,DataGrid).CancelEdit (DataGridEditingUnit.Cell)  
           End Try
        
        End Sub




#End Region






#End Region

#Region "CHECKBOXs"

Private Sub chkSelectTodoPS_Checked(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles chkSelectTodoPS.Checked
  
 If grdPSMonitorEJ.Items.Count > 0 then 
    For Each ps As CTPartidaSolicitud  in grdPSMonitorEJ.Items 
        ps.SeleccionEJ = true           
    Next
    grdPSMonitorEJ.Items.Refresh 
    grdPSMonitorEJ.UpdateLayout ()
 End If

End Sub

Private Sub chkSelectTodoPS_Unchecked(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles chkSelectTodoPS.Unchecked
    
 If grdPSMonitorEJ.Items.Count > 0 then 
    For Each ps As CTPartidaSolicitud  in grdPSMonitorEJ.Items 
        ps.SeleccionEJ = false           
    Next
    grdPSMonitorEJ.Items.Refresh 
    grdPSMonitorEJ.UpdateLayout ()
 End If
   



End Sub


Private Sub chkSelectTodoPAJ_Checked(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles chkSelectTodoPAJ.Checked
Dim i      As Long 
Dim chkPAJ As CheckBox 


   For i =0 to grdAJUMonitorEJ.Items.Count-1
     chkPAJ =  grdAJUMonitorEJ.Columns(0).GetCellContent (grdAJUMonitorEJ.Items (i))
     chkPAJ.IsChecked = True 
   Next


End Sub

Private Sub chkSelectTodoPAJ_Unchecked(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles chkSelectTodoPAJ.Unchecked
Dim i      As Long 
Dim chkPAJ As CheckBox 


   For i =0 to grdAJUMonitorEJ.Items.Count-1
     chkPAJ =  grdAJUMonitorEJ.Columns(0).GetCellContent (grdAJUMonitorEJ.Items (i))
     chkPAJ.IsChecked = false
   Next

 

End Sub


Private Sub chkCancelarPS_Unchecked(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles chkCancelarPS.Unchecked

   txtObservacionCancelar.Text = ""
   txtObservacionCancelar.IsEnabled = False
   btnCalcelapPS.IsEnabled = False  

End Sub

Private Sub chkCancelarPS_Checked(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles chkCancelarPS.Checked

   txtObservacionCancelar.Text = ""
   txtObservacionCancelar.IsEnabled = true
   btnCalcelapPS.IsEnabled = true

End Sub



Private Sub chkActivarEdicionPEJ_Checked(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles chkActivarEdicionPEJ.Checked
    

    If Not psSelActual is Nothing        
         grdEnProcDistribEJ.SelectedItem = psSelActual 
         cargarTextRemDistib()                 
    End If
   


    colDitribInterEdicion.ItemsSource = lstCatInterParamSel
    grdDistribPEJ.ItemsSource  = lstSubPEJEdicion
    

    brdEdicionPEJ.Background = Brushes.White  
    chkActivarEdicionPEJ.Foreground = Brushes.Black    
    grdDistribPEJ.Background = Brushes.White       



    grdDistribPEJ.IsEnabled  = True
    btnAgregarPEJ.IsEnabled  = True 
    btnEliminarPEJ.IsEnabled = True     
    btnGuardar.IsEnabled = True
          
     grdDistribPEJ.UpdateLayout ()


End Sub

Private Sub chkActivarEdicionPEJ_Unchecked(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles chkActivarEdicionPEJ.Unchecked
   brdEdicionPEJ.Background = Brushes.Gray 
   chkActivarEdicionPEJ.Foreground = Brushes.White
   grdDistribPEJ.Background = Brushes.LightGray 

   grdDistribPEJ.IsEnabled   = False
   btnAgregarPEJ.IsEnabled   = False
   btnEliminarPEJ.IsEnabled  = false   
   btnGuardar.IsEnabled      = false

  grdDistribPEJ.ItemsSource = Nothing


    

    If Not psSelActual is Nothing         
        grdEnProcDistribEJ.SelectedItem = psSelActual  
        cargarTextRemDistib(true)
    End If
    


End Sub


#End Region


Private Sub SubPej_PropertyChanged(sender As Object, e As PropertyChangedEventArgs)
 
    Try
       


       cargarTextRemDistib()


       Dim lstSimulacionMenos = negocio.ObtenerLstSimulacionBaseMenosEdicionIni (lstSimulacion,lstSubPEJ,lstCatInterParam, dMontoTotalPeriodo )  
       Dim lstSimulacionMas   = negocio.ObtenerLstSimulacionMasEdicion (lstSimulacionMenos,lstSubPEJEdicion,lstCatInterParam,dMontoTotalPeriodo  )  

       grdSimuladorEJ.ItemsSource = lstSimulacionMas
       grdSimuladorEJ.UpdateLayout ()

       dTotalesDistribSimula         = negocio.ObtenerMontoTotalPsXInter(lstSimulacionMas)
       txtMontoTotInter.Text         = dTotalesDistribSimula.MontoOperado.ToString ("##,##0.00")
       txtMontoTotDisponible.Text    = dTotalesDistribSimula.MontoDisponible.ToString ("##,##0.00")
       txtPorcentajeOperado.Text     = dTotalesDistribSimula.PorcentajeOperado
       txtPorcentajeDisponible.Text  = dTotalesDistribSimula.PorcentajeDisponible



    Catch ex As Exception
           
    End Try    

End Sub



Private Sub dtFecIni_SelectedDateChanged(ByVal sender As System.Object , ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles dtFecIni.SelectedDateChanged
     
     Dim dpicker = CType (sender,DatePicker)
     Dim sMsgError As String = ""
 
    
     If EvenTriggerCod = True  then 
        e.Handled = True 
        Exit Sub 
     End If
   

                If dfechaPeriodEJ <> dpicker.SelectedDate  then
                      
                     If  dpicker.SelectedDate > dFechaActual then 
                        MessageBox.Show ("La fecha tiene que ser menor o igual al día de hoy", "Cambio de la fecha del periodo", MessageBoxButton.OK,MessageBoxImage.Exclamation  )
                        e.Handled =True 
                        dtFecIni.SelectedDate = dfechaPeriodEJ
                        Exit Sub 
                     End If

                
                    Mouse.OverrideCursor = Cursors.Wait 

                   If negocio.ActualizarFechaPeriodoEJ (dpicker.SelectedDate,sMsgError) = True  then 
                      dfechaPeriodEJ  =  dpicker.SelectedDate
                      

                     
                       InicializarCtrlsDistrib()                           
                     

                       Mouse.OverrideCursor = Nothing 
                       MessageBox.Show ("La fecha ha sido cambiada con exito", "Cambio de la fecha del periodo", MessageBoxButton.OK,MessageBoxImage.Information  )
                       Mouse.OverrideCursor = Cursors.Wait
                   else

                      Mouse.OverrideCursor = Nothing
                      MessageBox.Show (": " & sMsgError, "Cambio de la fecha del periodo", MessageBoxButton.OK,MessageBoxImage.Error)
                     
                   End If
                       
                
                End If








    Mouse.OverrideCursor = Nothing

End Sub

Private Sub FLDistEnPEJ_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded

 '--------------Inicio Carga de PS en proceso----------------      
 lstPSEnProcesoEdicion= New ObservableCollection(Of CTPartidaSolicitud)(negocio.ObtenerPSEnProcesoDeBSO ())
 grdEnProcDistribEJ.ItemsSource = lstPSEnProcesoEdicion
 grdEnProcDistribEJ.UpdateLayout()
 txtNumEnProcesoDistrib.Text  = grdEnProcDistribEJ.Items.Count 
 '--------------Fin Carga de PS en proceso----------------      
   

End Sub

Private Sub tabParametros_GotFocus(ByVal sender As System.Object , ByVal e As System.Windows.RoutedEventArgs) Handles tabParametros.GotFocus
        InhabilitarCheckParamInter()
End Sub



#Region "Actualización de la pantalla por notificación"

    Private SUB ActualizarPantallaPEJ() 
    
    
    ' 1. Carga de la BSO
    
           Try
                BSO.CargarBSOActual()
           Catch ex As Exception                
                Throw ex
           End Try       
         
    
    ' 2. Cargar el grid de PS Recibidas 
    
           lstPSRecibidas = New ObservableCollection(Of CTPartidaSolicitud)(negocio.ObtenerPSEnviadasDeBSO())
           grdPSMonitorEJ.ItemsSource = lstPSRecibidas
           grdPSMonitorEJ.UpdateLayout()
           txtNumPSrecibidas.Text = grdPSMonitorEJ.Items.Count                      
    
    
     '3. Cargar el grid de PAJ Recibidas 
              
         lstPAJCompuesta  = negocio.ObtenerPajCompuestaEnviadas()
         grdAJUMonitorEJ.ItemsSource = lstPAJCompuesta 
         grdAJUMonitorEJ.UpdateLayout()
         txtNumPAJRecibidas.Text = grdAJUMonitorEJ.Items.Count
    

    
     '4. Cargar el grid de Canceladas 
         
         lstPSCanceladaEJ = negocio.ObtenerPSCanceladasDesdeEJ () 
         grdPSCanceladaMonitorEJ.ItemsSource =  lstPSCanceladaEJ
         grdPSCanceladaMonitorEJ.UpdateLayout ()
         txtNumCancel.Text = grdPSCanceladaMonitorEJ.Items.Count () 

        
       
     '5. Cargar el grid de En Proceso
    
       lstPSEnProceso = New ObservableCollection(Of CTPartidaSolicitud)(negocio.ObtenerPSEnProcesoDeBSO ())
       
       grdEnProcMonitorEJ.ItemsSource = lstPSEnProceso
       grdEnProcMonitorEJ.UpdateLayout() 
       txtNumEnProceso.Text = grdEnProcMonitorEJ.Items.Count
       txtNumEnProcesoDistrib.Text = txtNumEnProceso.Text
      
    
    
    
     '6. Cargar el grid de Liberadas 
    
       lstPSLiberadas = New ObservableCollection(Of CTPartidaSolicitud)(negocio.ObtenerPSLiberadaEnfoqueEJ())
       grdLiberadaMonitorEJ.ItemsSource = lstPSLiberadas
       grdLiberadaMonitorEJ.UpdateLayout()
       txtNumLib.Text = grdLiberadaMonitorEJ.Items.Count
    
        
    
     '7. Cargar el grid de PAJ Aplicadas
         lstPAJCompUestaAplicada   = negocio.ObtenerPajCompuestaAplicada ()
         grdPAJApliMonitorEJ.ItemsSource = lstPAJCompUestaAplicada 
         grdPAJApliMonitorEJ.UpdateLayout()
         txtNumPAJApli.Text = grdPAJApliMonitorEJ.Items.Count
    
    
       
       '8. Cargar el Total de Recibidas: PS Enviadas + Ajustes + Canceladas
       txtRecibidas.Text =   grdPSMonitorEJ.Items.Count + grdAJUMonitorEJ.Items.Count 
                               
    
    
    
    End Sub 


   
    


#End Region

#Region "Pestaña de Distribucion por Intermediario"


        Private Sub InicializarCtrlsDistrib()
                Dim sMsgError As String = ""
                EvenTriggerCod = True 
           
                Try
        
                
                '1. Cargar PS en Proceso almacenadas en la BSO
                psSelActual = Nothing  
                lstPSEnProcesoEdicion= New ObservableCollection(Of CTPartidaSolicitud)(negocio.ObtenerPSEnProcesoDeBSO ())
                grdEnProcDistribEJ.ItemsSource = lstPSEnProcesoEdicion
                grdEnProcDistribEJ.UpdateLayout 
                grdEnProcDistribEJ.SelectedItem =Nothing 
                grdEnProcDistribEJ.Items.Refresh ()
        
                '2. Configuración de Objetos Gráficos
                
                 btnLiberarPEJ.IsEnabled = False 
                 grdDistribAlmacenadaPEJ.ItemsSource = Nothing
                 chkActivarEdicionPEJ.IsChecked = False 
                 chkActivarEdicionPEJ.IsEnabled = False 
         
                 brdEdicionPEJ.Background = Brushes.Gray 
                 chkActivarEdicionPEJ.Foreground = Brushes.White
                 grdDistribPEJ.Background = Brushes.LightGray 
        
                 grdDistribPEJ.IsEnabled   = False
                 btnAgregarPEJ.IsEnabled   = False
                 btnEliminarPEJ.IsEnabled  = false   
                 btnGuardar.IsEnabled      = false                             
                 
        
                 grdDistribPEJ.ItemsSource = Nothing
                             
                 dtFecIni.IsEnabled = True 
                 
                
                    
        
                 lstSubPEJ = Nothing 
                 lstSubPEJEdicion.Clear ()
                 lstSubPejEliminada.Clear ()    
                                     
            
        
        
             '3. cargar Fecha de Periodo de Ejecución
                dfechaPeriodEJ = negocio.obtenerFechaIniPeriodoEJ ()                    
                dFechaActual = servicioGralFrida.ObtenerFechaActual ()     
                dFechaPeriodoEJFin = dFechaActual
                
                dtFecIni.SelectedDate = dfechaPeriodEJ 
                
        
                  
              '4) Limpiar controles de cancelación 
                  chkCancelarPS.IsChecked = False  
                      
        
        
        
               Catch ex As Exception
                   EvenTriggerCod = False 
               End Try
        
        
               '5. Cargar Simulacion (Datos Base almacenados)
               Try
        
                   dMontoTotalPeriodo = negocio.ObtenerMontoTotalPS (dfechaPeriodEJ,sMsgError) 'Mandar posible mensaje de notificación
                   txtMontoTotal.Text = dMontoTotalPeriodo.ToString ("##,##0.00")    
        
        
                   lstSimulacion = negocio.ObtenerLstSimulacionBase (dfechaPeriodEJ.ToString ("yyyy-MM-dd"),lstCatInterParamSel, dMontoTotalPeriodo)
                   grdSimuladorEJ.ItemsSource = lstSimulacion  
                   grdSimuladorEJ.UpdateLayout ()
        
        
                   
        
              

                   dTotalesDistribSimula         = negocio.ObtenerMontoTotalPsXInter(lstSimulacion)
              
                   txtMontoTotInter.Text         = dTotalesDistribSimula.MontoOperado.ToString ("##,##0.00")
                   txtMontoTotDisponible.Text    = dTotalesDistribSimula.MontoDisponible.ToString ("##,##0.00")
                   txtPorcentajeOperado.Text     = dTotalesDistribSimula.PorcentajeOperado
                   txtPorcentajeDisponible.Text  = dTotalesDistribSimula.PorcentajeDisponible

                   


        
               Catch ex As Exception
                    lstSimulacion = Nothing 
               End Try
               
        
                EvenTriggerCod = False 
             
        
        End Sub

        Private Sub InhabilitarCheckParamInter()
            Dim i           As Long 
            Dim chkPAJ      As CheckBox 
            Dim paramInter  As CTParamIntermediario 
            
            Dim lstInterUsado As List(Of Long)
            
            lstInterUsado = negocio.ObtenerIntermediariosEnUtilizados (BSO.BSOId )
            
            For i =0 to grdParamIntermediario.Items.Count-1
                paramInter = grdParamIntermediario.Items (i)
                chkPAJ =  grdParamIntermediario.Columns(0).GetCellContent (paramInter)
                
                If lstInterUsado.Find(Function(x) x.Equals(paramInter.IdIntermediario) ) > 0 then 
                   If Not chkPAJ is Nothing then 
                       chkPAJ.IsChecked = True 
                       chkPAJ.IsEnabled = False
                    End If   
                     
                Else 
                    If Not chkPAJ is Nothing then 
                       chkPAJ.IsEnabled = True 
                    End If
                   
                End If    
            
            
            Next    
        End Sub

#End Region





Public Sub cargarTextRemDistib(Optional ByVal limpiar As Boolean = False )

  Dim montoDistrib   As Decimal = 0 
  Dim montoRemanente As Decimal = 0 


   If limpiar = True then 
     txtMontoDistrib.Text = montoDistrib.ToString ("$ ##,##0.00") 
     txtMontoRemanente.Text =  montoRemanente.ToString ("$ ##,##0.00")
     txtMontoRemanente.Foreground = Brushes.Black 
     Exit Sub 
   End If

    
    negocio.ObtenerMontoRemanenteyDistribuido (lstSubPEJEdicion,psSelActual,montoRemanente,montoDistrib)
    txtMontoDistrib.Text = montoDistrib.ToString ("$ ##,##0.00") 
    txtMontoRemanente.Text =  montoRemanente.ToString ("$ ##,##0.00")
    If montoRemanente < 0 Then
       txtMontoRemanente.Foreground = Brushes.Red   
    else
       txtMontoRemanente.Foreground = Brushes.Black 
    End If


End Sub



#Region "COPIADO DEL GRID"


    Private Sub grdSimuladorEJ_MouseRightButtonUp(ByVal sender As System.Object , ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles grdSimuladorEJ.MouseRightButtonUp

    Dim objDepend As DependencyObject = e.OriginalSource
        Dim celda As DataGridCell = Nothing


        Me.grdSimuladorEJ.ContextMenu = Nothing
        While Not objDepend Is Nothing

            If objDepend.GetType().Name = "DataGridCell" Then
                celda = objDepend

                If celda.IsSelected = False Then
                    Me.grdSimuladorEJ.UnselectAllCells()
                    celda.IsSelected = True
                End If

                celda.Focus()

               
                    Me.grdSimuladorEJ.ContextMenu = AgregarMenuContextual()
               
                Exit While
            End If

            objDepend = VisualTreeHelper.GetParent(objDepend)
        End While



End Sub

    Private Function AgregarMenuContextual() As ContextMenu
        Dim miMenuContextual As New ContextMenu
        Dim mnuCopia As New System.Windows.Controls.MenuItem
        Dim mnuPegar As New System.Windows.Controls.MenuItem



        mnuCopia.Header = "Copiar"
        miMenuContextual.Items.Add(mnuCopia)
        AddHandler mnuCopia.Click, AddressOf mnuCopiar_click       

        Return miMenuContextual

    End Function

    Private Sub mnuCopiar_click(ByVal sender As Object, ByVal e As RoutedEventArgs)

        Try
            
            If copiarCeldas(Me.grdSimuladorEJ, "General.CTCorridaIntermediario") = False Then
                MessageBox.Show("El rango de celdas seleccionado no es correcto", "Copiar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
            End If
        Catch ex As Exception
            MessageBox.Show("Error TI500. Error al intentar copiar celdas: " & ex.Message, "Copiado", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try

    End Sub

    Private Function copiarCeldas(ByRef gridDeDatos As DataGrid, ByVal sTipo As String) As Boolean

        Dim ttipo As System.Type = Type.GetType(sTipo)

        Try

            Dim lstInterAux As Object = gridDeDatos.ItemsSource


            Dim datos As New System.Text.StringBuilder
            Dim copiadoCorrecto As Boolean = True


            Dim colIni As Integer = Integer.MaxValue
            Dim rowIni As Integer = Integer.MaxValue

            Dim colFin As Integer = Integer.MinValue
            Dim rowFin As Integer = Integer.MinValue


            Dim i As Integer = 0
            Dim j As Integer = 0


            Dim columnasIndex(gridDeDatos.SelectedCells.Count - 1) As Integer
            Dim renglonesIndex(gridDeDatos.SelectedCells.Count - 1) As Integer

            For Each celda As DataGridCellInfo In gridDeDatos.SelectedCells

                renglonesIndex(i) = gridDeDatos.Items.IndexOf(CTypeDynamic(celda.Item, ttipo))
                columnasIndex(j) = celda.Column.DisplayIndex
                i += 1
                j += 1
            Next


            rowIni = renglonesIndex.Min()
            rowFin = renglonesIndex.Max()

            colIni = columnasIndex.Min()
            colFin = columnasIndex.Max()


            For i = rowIni To rowFin
                For j = colIni To colFin
                    If EsSeleccionadaLaCelda(gridDeDatos, i, j) Then
                        datos.Append(lstInterAux(i)(j).ToString() & vbTab)
                    Else
                        copiadoCorrecto = False
                        GoTo fuera
                    End If
                Next

                datos.Remove(datos.Length - 1, 1)
                datos.Append(vbLf)
            Next


            datos.Remove(datos.Length - 1, 1)



fuera:
            If copiadoCorrecto = True Then
                Clipboard.Clear()
                Clipboard.SetText(datos.ToString())
                Return True
            Else
                Return False
            End If


        Catch ex As Exception

            Throw ex

        End Try




    End Function

    Private Function EsSeleccionadaLaCelda(ByRef gridDeDatos As DataGrid, ByVal indexRow As Integer, ByVal indexCol As Integer) As Boolean

        Dim row As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(indexRow)
        Dim cellContent As Object = gridDeDatos.Columns(indexCol).GetCellContent(row)


        Dim objDepend As DependencyObject = cellContent
        Dim celda As DataGridCell = Nothing

        While Not objDepend Is Nothing

            If objDepend.GetType().Name = "DataGridCell" Then
                celda = objDepend

                If celda.IsSelected = True Then
                    Return True
                Else
                    Return False
                End If

            End If

            objDepend = VisualTreeHelper.GetParent(objDepend)
        End While

        Return False

    End Function
    
    Private Sub grdSimuladorEJ_PreviewKeyDown(ByVal sender As System.Object , ByVal e As System.Windows.Input.KeyEventArgs) Handles grdSimuladorEJ.PreviewKeyDown
    
    
            If e.Key = Key.Apps Then           
              Me.grdSimuladorEJ.ContextMenu = AgregarMenuContextual()           
            End If
    
    
    
            If Keyboard.Modifiers = ModifierKeys.Control AndAlso e.Key = Key.C Then
                Try
                    If copiarCeldas(Me.grdSimuladorEJ, "General.CTCorridaIntermediario") = False Then
                        e.Handled = True 'Se indica que el evento ha sido manejado antes del mensaje, ya que este renderiza la pantalla
                        MessageBox.Show("El rango de celdas seleccionado no es correcto", "Copiar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                    End If
    
                Catch ex As Exception
                    e.Handled = True
                    MessageBox.Show("Error TI500. Error al intentar copiar celdas: " & ex.Message, "Copiado", MessageBoxButton.OK, MessageBoxImage.Error)
                End Try
    
            End If
    
    
    End Sub
    


#End Region







End Class

' Custom class implements the IValueConverter interface.
Public Class CambiarBoleanoAEspanol
    Implements IValueConverter

   
 Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        If value = False   then             
            Return "No"
         else
            Return "Si"
        End If 

    End Function

    Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New Exception 
    End Function



End Class

